/* Pretty-printing name. */
char name[32];
- /* RANGESETF_??? */
+ /* RANGESETF flags. */
unsigned int flags;
};
return x;
}
+/* Return the lowest range in the set r, or NULL if r is empty. */
+static struct range *first_range(
+ struct rangeset *r)
+{
+ if ( list_empty(&r->range_list) )
+ return NULL;
+ return list_entry(r->range_list.next, struct range, list);
+}
+
+/* Return range following x in ascending order, or NULL if x is the highest. */
+static struct range *next_range(
+ struct rangeset *r, struct range *x)
+{
+ if ( x->list.next == &r->range_list )
+ return NULL;
+ return list_entry(x->list.next, struct range, list);
+}
+
/* Remove a range from its list and free it. */
static void destroy_range(
struct range *x)
{
if ( x == NULL )
{
- x = list_entry(r->range_list.next, struct range, list);
+ x = first_range(r);
x->s = s;
}
else if ( (x->e < s) && ((x->e + 1) != s) )
{
- x = list_entry(x->list.next, struct range, list);
+ x = next_range(r, x);
x->s = s;
}
for ( ; ; )
{
- y = list_entry(x->list.next, struct range, list);
- if ( (x->list.next == &r->range_list) || (y->e > x->e) )
+ y = next_range(r, x);
+ if ( (y == NULL) || (y->e > x->e) )
break;
destroy_range(y);
}
}
- y = list_entry(x->list.next, struct range, list);
- if ( (x->list.next != &r->range_list) && ((x->e + 1) == y->s) )
+ y = next_range(r, x);
+ if ( (y != NULL) && ((x->e + 1) == y->s) )
{
x->e = y->e;
destroy_range(y);
else
{
if ( x == NULL )
- x = list_entry(r->range_list.next, struct range, list);
+ x = first_range(r);
if ( x->s < s )
{
x->e = s - 1;
- x = list_entry(x->list.next, struct range, list);
+ x = next_range(r, x);
}
while ( x != y )
{
t = x;
- x = list_entry(x->list.next, struct range, list);
+ x = next_range(r, x);
destroy_range(t);
}
void rangeset_destroy(
struct rangeset *r)
{
+ struct range *x;
+
if ( r == NULL )
return;
spin_unlock(&r->domain->rangesets_lock);
}
- while ( !list_empty(&r->range_list) )
- {
- struct range *x = list_entry(r->range_list.next, struct range, list);
+ while ( (x = first_range(r)) != NULL )
destroy_range(x);
- }
xfree(r);
}